/**
 * Jest测试环境设置
 * 在所有测试运行前执行，配置测试数据库和全局设置
 */

import { jest, beforeAll, afterEach, afterAll } from '@jest/globals';
import { sequelize } from '../src/models/index.js';

// 设置测试超时时间
jest.setTimeout(10000);

// 在所有测试开始前执行
beforeAll(async () => {
  try {
    // 测试数据库连接
    await sequelize.authenticate();
    console.log('✅ 测试数据库连接成功');

    // 禁用外键检查
    await sequelize.query('SET FOREIGN_KEY_CHECKS = 0');

    // 手动删除所有表（先删除有外键约束的表）
    await sequelize.query('DROP TABLE IF EXISTS `essays`');
    await sequelize.query('DROP TABLE IF EXISTS `users`');
    
    // 重新创建表（不使用force，因为表已经删除了）
    await sequelize.models.User.sync();
    await sequelize.models.Essay.sync();

    // 启用外键检查
    await sequelize.query('SET FOREIGN_KEY_CHECKS = 1');
    
    console.log('✅ 测试数据库模型同步完成');
  } catch (error) {
    console.error('❌ 测试环境初始化失败:', error);
    throw error;
  }
});

// 在每个测试后执行
afterEach(async () => {
  // 清理测试数据 - 先删除有外键约束的表
  try {
    await sequelize.models.Essay.destroy({ where: {}, force: true });
    await sequelize.models.User.destroy({ where: {}, force: true });
  } catch (error) {
    // 忽略清理错误
    console.warn('清理测试数据时出现警告:', error.message);
  }
});

// 在所有测试结束后执行
afterAll(async () => {
  try {
    // 关闭数据库连接
    await sequelize.close();
    console.log('✅ 测试数据库连接已关闭');
  } catch (error) {
    console.error('❌ 关闭数据库连接失败:', error);
  }
});

// 导出常用的测试工具函数
export const clearDatabase = async () => {
  const models = sequelize.models;
  for (const modelName of Object.keys(models)) {
    await models[modelName].destroy({ where: {}, truncate: true, cascade: true });
  }
};

export const createTestUser = async (overrides = {}) => {
  const { User } = sequelize.models;
  // 生成一个简短的随机字符串（最多6位数字）确保用户名不超过20个字符
  const randomId = Math.floor(Math.random() * 999999);
  const defaultUser = {
    username: `test${randomId}`,
    passwordHash: '$2b$10$abcdefghijklmnopqrstuv', // 预加密的密码
    gradeLevel: 'middle',
    ...overrides,
  };
  return await User.create(defaultUser);
};

export const createTestEssay = async (userId, overrides = {}) => {
  const { Essay } = sequelize.models;
  const defaultEssay = {
    userId,
    title: '测试作文',
    content: '这是一篇测试作文内容'.repeat(10), // 确保满足50字符的最小长度
    gradeLevel: 'middle',
    status: 'pending',
    ...overrides,
  };
  return await Essay.create(defaultEssay);
};

